/**********************************
 * 文件:hmi接口 头文件-soap2cpp编译用
 * 创建者:林鸿铭
 * 创建时间:2016.11.3
 * copyright:(c)同川科技
 * 备注:有未确定数据类型,暂时"待定"
 * 修改者:
 **********************************/
#ifndef HMIAPI_H
#define HMIAPI_H

#include <vector>

#include <string>

#import "import/stlvector.h"


//***************结构体部分********************************
/**
 * @brief The UserInfo struct       用户信息
 */
struct UserInfo
{
    int account;                    //用户ID 普通用户 超级用户
    std::string password;           //密码
    std::string ip;                 //IP地址
    std::string operationSystem;    //操作系统

int currentRobotIndex; //对应机器人结构体
};

/**
 * @brief The PointPro struct       点信息
 */
struct PointPro
{
    int jointFlag;                  //0:关节;1:笛卡尔;
    int pointNum;                   //点 编号
    int groupNum;                   //组 编号
    int ufValue;                    //用户坐标系 编号
    int utValue;                    //工具坐标系 编号
    int direction;                  //左右手姿态
    std::string configString;       //多解 选择;多圈 选择
    std::vector<int> configInt;     //多解 选择;多圈 选择
    std::vector<float> positionValue;//关节值 or 笛卡尔值
};

/**
 * @brief The Message struct        信息结构体
 */
struct Message
{
    int MessageLevel;               //消息级别
    std::string time;               //产生时间
    std::string componentName;      //组件实例名
    std::string componentClassName; //组件类名
    std::string messageType;        //消息类型
    int messageCode;                //消息ID
    int parameter1;                 //消息参数1
    int parameter2;                 //消息参数2
    std::string parameter3;         //消息参数3
    std::string parameter4;         //消息参数4
    std::string MessageInformation; //消息内容(提供用户可见)
};

/**
 * @brief The CurrentRunFile struct 当前运行程序
 */
struct CurrentRunFile
{
    std::vector<std::string> runingFileName;     //当前运行程序名
    std::vector<int> runningFileLine;            //当前运行行号

	std::vector<std::string> relatedFileName;	//所有关联程序名
};

/**
 * @brief The ComponentVersion struct   组件版本
 */
struct ComponentVersion
{
    std::string componentName;               //组件名
    std::string componentVersion;            //组件版本
    std::string publishDate;                 //发布时间
};

struct RobotInfo
{
	int robotId;					//当前控制的机器人ID

	std::string robotName;

	std::string robotSpecification;	//机器人规格

	int robotType;					//机器人类型

	std::string robotFileAddress;	//

	std::string robotPictureAddress;

};

//***************hmi需要更新的数据********************************
struct UpdateDataLv1
{
int globalSerialStatus;

int globalRegStatus;

int globalMotorType;

std::string globalSerialValue;

std::string globalLockMachTime;

std::string mainProgramVersion;

std::vector<struct ComponentVersion> componentVersionList;

std::vector<struct UserInfo> multiUserInfo;

int currentLanguage;

std::vector<std::vector <float> >  axisLimit;

std::vector<int> axisUnit;

int robotAxisCount;

int extAxisCount;

std::string controllerIp;

std::string controllerMac;

std::vector <struct RobotInfo>  robotInfoList;
};

struct UpdateDataLv2
{
	std::vector<struct Message> messageVector;//20161108

	int globalSafePointFlag;

	int globalHandSwitch;

	int globalProSpeed;

	int globalManSpeed;

	int globalHandRunStatus;

	int globalZeroCtrlFlag;

	int globalCoordinate;

	int globalCurrentState;

	int globalHandState;

	int globalServoState;

	int globalZeroStatus;

	int emergencyStatus;

	int globalPosType;

	int globalDefaultUserNum;

	int globalDefaultToolNum;

	int startType;

	struct PointPro currentPositionJoint;

	struct PointPro currentPositionWorld;

	struct PointPro currentPositionTool;

	struct PointPro currentPositionUser;

	std::vector<int> ioIn;

	std::vector<int> ioOut;

	std::vector<float> ai;

	std::vector<float> ao;

	std::vector<int> si;

	std::vector<int> so;

	std::vector<float> localRegister;

	std::vector<float> globalRegister;

	std::vector<struct PointPro> pointRegister;

	std::vector<int>  timerRegister;

	std::vector<std::vector <int> > plRegister;

	std::string currentTime;

	std::vector<float> axisTorque;

	std::vector<float> axisSpeed;

	std::vector<int> axisPosition;

	std::vector<int> axisFollowOffset;

	struct CurrentRunFile currentRunFile;

	std::string defaultUserFile;
};


//***************类型变量部分********************************
/**
 * @brief message               控制器消息[LV2]
 */
std::vector<struct Message> messageVector;//20161108

/**
 * @brief globalSafePointFlag   安全开关是否打开的标志[LV2]
 */
int globalSafePointFlag;

/**
 * @brief globalHandSwitch      使能开关[LV2]
 */
int globalHandSwitch;
/**
 * @brief globalProSpeed        自动运行速度[LV2]
 */
int globalProSpeed;
/**
 * @brief globalManSpeed        手动运行速度[LV2]
 */
int globalManSpeed;
/**
 * @brief globalHandRunStatus   手动运行状态，（手动单步，手动连续）[LV2]
 */
int globalHandRunStatus;

/**
 * @brief globalZeroCtrlFlag    回零的第二个标志位，判断回零状态（正在原点回零，回零完成）[LV2]
 */
int globalZeroCtrlFlag;
/**
 * @brief globalCoordinate      手动坐标系[LV2]
 */
int globalCoordinate;
/**
 * @brief globalCurrentState    程序的运行状态，（运行，暂停，停止）[LV2]
 */
int globalCurrentState;
/**
 * @brief globalHandState       程序的运行模式（T1/T2/Auto/EXT）[LV2]
 */
int globalHandState;
/**
 * @brief globalServoState      伺服状态[LV2]
 */
int globalServoState;

/**
 * @brief globalZeroStatus      回零状态（是否回过零，按键Btn显示）[LV2]
 */
int globalZeroStatus;
/**
 * @brief globalLoginStatus     登陆状态(不需要,自切换页面用)
 */
bool globalLoginStatus;

/**
 * @brief globalSerialStatus    序列号状态（有、无序列号）[LV1]
 */
int globalSerialStatus;
/**
 * @brief globalRegStatus       注册状态（有效、快要过期、已经过期、永久有效）[LV1]
 */
int globalRegStatus;
/**
 * @brief emergencyStatus       急停状态[LV2]
 */
int emergencyStatus;
/**
 * @brief globalMotorType       电机类型[LV1]
 */
int globalMotorType;


/**
 * @brief globalPosType         点位的保存方式:（0代表X、Y、Z、W、P、R），（1代表Deg）[LV2]
 */
int globalPosType;
/**
 * @brief globalDefaultUserNum  默认(当前)的用户坐标[LV2]
 */
int globalDefaultUserNum;
/**
 * @brief globalDefaultToolNum  默认的工具坐标[LV2]
 */
int globalDefaultToolNum;


/**
 * @brief globalSerialValue     序列号[LV1]
 */
std::string globalSerialValue;
/**
 * @brief globalLockMachTime    锁机时间[LV1]
 */
std::string globalLockMachTime;

/**
 * @brief startType             启动方式()[LV2]
 */
int startType;
/**
 * @brief mainProgramVersion    控制器版本号[LV1]
 */
std::string mainProgramVersion;

/**
 * @brief componentVersionList  组件版本列表[LV1]
 */
std::vector<struct ComponentVersion> componentVersionList;

/**
 * @brief multiUserInfo         多用户信息[LV1]
 */
std::vector<struct UserInfo> multiUserInfo;
/**
 * @brief currentLanguage       当期语言[LV1]
 */
int currentLanguage;

/**
 * @brief currentPositionJoint  当前点 关节信息[LV2]
 */
struct PointPro currentPositionJoint;
/**
 * @brief currentPositionWorld  当前点 世界坐标[LV2]
 */
struct PointPro currentPositionWorld;
/**
 * @brief currentPositionTool   当前点 工具坐标[LV2]
 */
struct PointPro currentPositionTool;
/**
 * @brief currentPositionUser   当前点 用户坐标[LV2]
 */
struct PointPro currentPositionUser;

/**
 * @brief axisLimit             轴软限位[LV1](改动再更新)
 */
std::vector<std::vector <float> >  axisLimit;

/**
 * @brief axisUnit              轴单位[LV1]
 */
std::vector<int> axisUnit;

/**
 * @brief robotAxisCount        轴数[LV1]
 */
int robotAxisCount;
/**
 * @brief extAxisCount          外部轴数[LV1]
 */
int extAxisCount;



/**
 * @brief ioIn                  DI[LV2]
 */
std::vector<int> ioIn;
/**
 * @brief ioOut                 DO[LV2]
 */
std::vector<int> ioOut;
/**
 * @brief ai                    AI[LV2]
 */
std::vector<float> ai;
/**
 * @brief ao                    AO[LV2]
 */
std::vector<float> ao;
/**
 * @brief si                    SI[LV2]
 */
std::vector<int> si;
/**
 * @brief so                    SO[LV2]
 */
std::vector<int> so;
/**
 * @brief localRegister         局部寄存器[LV2]
 */
std::vector<float> localRegister;
/**
 * @brief globalRegister        全局寄存器[LV2]
 */
std::vector<float> globalRegister;
/**
 * @brief pointRegister         PR[LV2]
 */
std::vector<struct PointPro> pointRegister;
/**
 * @brief timerRegister         时间寄存器[LV2]
 */
std::vector<int>  timerRegister;
/**
 * @brief plRegister            PL[LV2]
 */
std::vector<std::vector <int> > plRegister;

/**
 * @brief currentTime           当前时间[LV2]
 */
std::string currentTime;
/**
 * @brief controllerIp          控制器IP[LV1]
 */
std::string controllerIp;
/**
 * @brief controllerMac         控制器MAC[LV1]
 */
std::string controllerMac;

/**
 * @brief axisTorque            电机力矩[LV2]
 */
std::vector<float> axisTorque;
/**
 * @brief axisSpeed             电机速度[LV2]
 */
std::vector<float> axisSpeed;
/**
 * @brief axisPosition          电机位置[LV2]
 */
std::vector<int> axisPosition;
/**
 * @brief axisFollowOffset      电机跟随误差[LV2]
 */
std::vector<int> axisFollowOffset;

/**
 * @brief currentRunFile		当前运行程序[LV2]
 */
struct CurrentRunFile currentRunFile;

/**
 * @brief defaultUserFile       缺省程序[LV2]
 */
std::string defaultUserFile;

/**
 * @brief controllerIsConnected 连接状态(自用)
 */
int controllerIsConnected;

/**
 * @brief controllerFileAddress 映射地址(自用)
 */
std::string controllerFileAddress;

/**
 * @brief robotInfoList 		机器人信息[LV1]
 */
std::vector <struct RobotInfo>  robotInfoList;

//***************接口函数部分********************************
//测试用
int testFoundation(struct UserInfo userInfo,struct UserInfo &returnnfo);
/**
 * @brief setUToolActive    工具坐标系切换 (0~9)
 * @param userInfo          用户信息
 * @param n                 切换编号
 * @param returnFlag        默认返回(RECV OK)
 * @return
 */
int setUToolActive(struct UserInfo userInfo,int number,int &returnFlag);

/**
 * @brief setUFrameActive   用户坐标系切换(0~9)
 * @param userInfo          用户信息
 * @param n                 切换编号
 * @param returnFlag        默认返回(RECV OK)
 * @return
 */
int setUFrameActive(struct UserInfo userInfo,int number,int &returnFlag);

/**
 * @brief getUFrameActive 获取激活的工具坐标系号码(0~9)
 * @param n
 * @param returnUToolNum
 */
int getUToolActive(struct UserInfo userInfo,int &returnUToolNum);

/**
 * @brief getUFrameActive 获取激活的用户坐标系号码(0~9)
 * @param n
 * @param returnUFrameNum
 */
int getUFrameActive(struct UserInfo userInfo,int &returnUFrameNum);

/**
 * @brief UpdateControllerInfoLevel hmi获取更新数据函数
 * Level1 等级分类
 * Level2
 * returnInfo 返回信息类型未定(待定)
 * @return
 */
int updateControllerInfoLevel1(struct UserInfo userInfo,struct UpdateDataLv1 &updateDataLv1);
int updateControllerInfoLevel2(struct UserInfo userInfo,struct UpdateDataLv2 &updateDataLv2);

/**
 * @brief UpdateUserProgramFile     更新用户程序
 * @param fileName                  程序名
 * @param md5                       MD5校验码
 * @param returnFlag
 * @return
 */
int updateUserProgramFile(struct UserInfo userInfo,std::string fileName,
                          std::string md5,int &returnFlag);

/**
 * @brief setDo                     设置DO
 * @param ioOutNum                  DO号
 * @param nOffOn                    ON OFF
 * @param returnFlag
 * @return
 */
int setDo(struct UserInfo userInfo,int ioOutNum,int nOffOn,int &returnFlag);

/**
 * @brief setManualSpeedPercent     设置 manual速度百分比
 * @param nSpeedValue
 * @param returnFlag
 * @return
 */
int setManualSpeedPercent(struct UserInfo userInfo,int nSpeedValue,int &returnFlag);
/**
 * @brief setManualSpeedPercent     设置 auto速度百分比
 * @param nSpeedValue
 * @param returnFlag
 * @return
 */
int setAutoSpeedPercent(struct UserInfo userInfo,int nSpeedValue,int &returnFlag);

/**
 * @brief setHandWheel              滚轮
 * @param axisNumber                轴
 * @param direction                 方向
 * @param velocity                  增量速度
 * @param returnFlag
 * @return
 */
int setHandWheel(struct UserInfo userInfo,int axisNumber,int direction,int velocity,int &returnFlag);

/**
 * @brief jogRun                    寸动
 * @param axisNumber                轴
 * @param direction                 方向
 * @param returnFlag
 * @return
 */
int jogRun(struct UserInfo userInfo,int axisNumber,int direction,int &returnFlag);

/**
 * @brief setProgramFileName        设置程序运行filename
 * @param programFileName
 * @param returnFlag
 * @return
 */
int setProgramFileName(struct UserInfo userInfo,std::string programFileName,int &returnFlag);

/**
 * @brief setProgramRunLine         设置程序运行 行
 * @param line
 * @param returnFlag
 * @return
 */
int setProgramRunLine(struct UserInfo userInfo,int line,int &returnFlag);

/**
 * @brief setRunModel               程序运行的模式设置
 * @param runModel                  0 T1手动\1 T2手动\2 自动\3 EX
 * @param returnFlag
 * @return
 */
int setRunModel(struct UserInfo userInfo,int runModel,int &returnFlag);

/**
 * @brief setDebugModel             手动调试的模式设置
 * @param debugModel                0 连续\1 单步
 * @param returnFlag
 * @return
 */
int setDebugModel(struct UserInfo userInfo,int debugModel,int &returnFlag);

/**
 * @brief setJogCoordinator         关节/全局/工具/用户坐标 设置
 * @param coordinator               0   1   2    3
 * @param returnFlag
 * @return
 */
int setJogCoordinator(struct UserInfo userInfo,int coordinator,int &returnFlag);

/**
 * @brief jMoveToPoint              关节移动到点
 * @param point                     点信息
 * @param returnFlag
 * @return
 */
int jMoveToPoint(struct UserInfo userInfo,struct PointPro point,int &returnFlag);

/**
 * @brief LMoveToPoint              直线移动到点
 * @param point                     点信息
 * @param returnFlag
 * @return
 */
int lMoveToPoint(struct UserInfo userInfo,struct PointPro point,int &returnFlag);

/**
 * @brief jMoveToProgramPoint       关节运行到程序点
 * @param userInfo
 * @param n(待定)
 * @return
 */
int jMoveToProgramPoint(struct UserInfo userInfo,int n,int &returnFlag);

/**
 * @brief LMoveToProgramPoint       直线运行到程序点
 * @param userInfo
 * @param n
 * @return
 */
int lMoveToProgramPoint(struct UserInfo userInfo,int n,int &returnFlag);


/**
 * @brief jMoveToPlPoint            关节移动到码垛点
 * @param palletNumber              (待定)
 * @param pointTpe
 * @param pointNumber
 * @param rowColumnLayer
 * @param returnFlag
 * @return
 */
int jMoveToPlPoint(struct UserInfo userInfo,int palletNumber,int pointTpe,int pointNumber,std::vector<int> rowColumnLayer,int &returnFlag);

/**
 * @brief lMoveToPlPoint            直线移动到码垛点
 * @param palletNumber              码垛(待定)
 * @param pointTpe
 * @param pointNumber
 * @param rowColumnLayer
 * @param returnFlag
 * @return
 */
int lMoveToPlPoint(struct UserInfo userInfo,int palletNumber,int pointTpe,int pointNumber,std::vector<int> rowColumnLayer,int &returnFlag);



/**
 * @brief stepRun                   运行(底部按钮)
 * @return
 */
int programRun(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief ceaseRun                  暂停(底部按钮)
 * @return
 */
int programCease(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief resetRun                  重置(stop)(底部按钮)
 * @return
 */
int programReset(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief returnZeroPoint           回零
 * @param userInfo
 * @param axisNumber
 * @return
 */
int returnZeroPoint(struct UserInfo userInfo,int axisNumber,int &returnFlag);

/**
 * @brief controllerShutDown        关机指令
 * @param userInfo
 * @param returnFlag
 * @return
 */
int controllerShutDown(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setManualServon           设置伺服使能
 * @param userInfo
 * @param nServOffOn
 * @param returnFlag
 * @return
 */
int setManualServon(struct UserInfo userInfo,int nServOffOn,int &returnFlag);


/**
 * @brief setRegisterNumber         输入注册码
 * @param registerString
 * @return
 */
int setRegisterNumber(struct UserInfo userInfo,std::string registerString,int &returnFlag);


/**
 * @brief getTcpConnectState        获取当前是否断开链接
 * @param userInfo
 * @param returnFlag
 * @return
 */
int getTcpConnectState(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setClearAllCounter        清空所有产量
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setClearAllCounter(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief setClearCurrentCounter    清空当前产量
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setClearCurrentCounter(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setRestoreFactory         恢复出厂设置
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setRestoreFactory(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setCoordMode              坐标系设置
 * @param userInfo
 * @param nCoordId
 * @param returnFlag
 * @return
 */
int setCoordMode(struct UserInfo userInfo,int nCoordId,int &returnFlag);


/**
 * @brief setMsgClear               设置清除消息
 * @param userInfo
 * @param messageId
 * @param returnFlag
 * @return
 */
int setMsgClear(struct UserInfo userInfo,int messageId,int &returnFlag);



/**
 * @brief SetSingleCaliber          零点标定设置
 * @param userInfo
 * @param asixId
 * @param returnFlag
 * @return
 */
int setSingleCaliber(struct UserInfo userInfo,int asixId,int &returnFlag);
/**
 * @brief SetAllCaliber             零点标定设置
 * @param userInfo
 * @param asixId
 * @param returnFlag
 * @return
 */
int setAllCaliber(struct UserInfo userInfo,int asixId,int &returnFlag);


/**
 * @brief clearPlRegister           清空栈板暂存器
 * @param userInfo
 * @param palletNumber
 * @param returnFlag
 * @return
 */
int clearPlRegister(struct UserInfo userInfo,int palletNumber,int &returnFlag);

//
/**
 * @brief setPlRegister             栈板寄存器修改生效
 * @param userInfo
 * @param palletNumber
 * @param rowColumnLayer
 * @param returnFlag
 * @return
 */
int setPlRegister(struct UserInfo userInfo,int palletNumber,std::vector<int> rowColumnLayer,int &returnFlag);

/**
 * @brief clearAllPlRegister        清空Pl寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllPlRegister(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setLocalRegister          设置局部寄存器
 * @param userInfo
 * @param number
 * @param value
 * @param returnFlag
 * @return
 */
int setLocalRegister(struct UserInfo userInfo,int number, float value,int &returnFlag);
/**
 * @brief clearAllLocalRegister     清除所有局部寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllLocalRegister(struct UserInfo userInfo,int &returnFlag);
/**
 * @brief setGlobalRegister         设置全局寄存器
 * @param userInfo
 * @param number
 * @param value
 * @param returnFlag
 * @return
 */
int setGlobalRegister(struct UserInfo userInfo,int number, float value,int &returnFlag);
/**
 * @brief clearAllGlobalRegister    清除所有全局寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllGlobalRegister(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief clearAllPrRegister        清除所有PR寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllPrRegister(struct UserInfo userInfo,int &returnFlag);
/**
 * @brief setPrRegister             设置PR寄存器
 * @param userInfo
 * @param number
 * @param point
 * @param returnFlag
 * @return
 */
int setPrRegister(struct UserInfo userInfo,int number,struct PointPro point,int &returnFlag);


/**
 * @brief updateControllerProgram               发送升级包
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
int updateControllerProgram(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief restoreControllerProgramBackupFile    还原
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
int restoreControllerProgramBackupFile(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief backupControllerProgram               备份
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
int backupControllerProgram(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief RestoreFactory                        恢复出厂设置
 * @param userInfo
 * @param returnFlag
 */
int restoreFactory(struct UserInfo userInfo,int &returnFlag);


#endif // HMIAPI_H
